package com.itheima.feign;

import com.itheima.config.FeignConfiguration;
import com.itheima.feign.fallback.UserFeignClientImpl;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

/**
 * @author Jt
 * @date 2021/4/6 21:34
 */

/**
 * 声明当前接口是feign客户端
 */

@FeignClient(value = "user-service",
        fallback = UserFeignClientImpl.class,
        configuration = FeignConfiguration.class)

// 启动类中 开启feign相当于开启 @FeignClient 注解扫描功能
// Feign会使用Jdk的动态代理技术,帮助我们创建一个代理的对象,注入到springIOC容器中去
// JDK 接口    CGLIB 必须能够被继承

public interface UserFeignClient {

    /**
     * 声明方法,指定要调用微服务的哪个方法
     * <p>
     * 当我们调用接口方法市时,实际上是代理对象被调用
     * <p>
     * 代理对象会根据你的注解配置 生成调用路径:
     *
     * @FeignClient(value = "user-service")
     * @GetMapping("/user/{id}") GET  http://user-service/user/itcast
     * <p>
     * Feign 集成了 Ribbon
     * Ribbon会根据负载均衡规则进行指定的掉用
     */

    @GetMapping("/user/{id}")
    public Map queryById(@PathVariable("id") String username);

    @PostMapping("/user")
    public String save(@RequestBody Map user);

    @DeleteMapping("/user/{id}")
    public String delete(@PathVariable("id") String username);
}
